# 1、在函数中定义函数
def hi(name="yasoob"):
    print("now you are inside the hi() function")

    def greet():
        return "now you are in the greet() function"

    def welcome():
        return "now you are in the welcome() function"

    print(greet())
    print(welcome())
    print("now you are back in the hi() function")


# hi()


# 2、函数中返回函数
# 其实并不需要在一个函数里去执行另一个函数，我们也可以将其作为输出返回:

def hi(name="yasoob"):
    def greet():
        return "now you are in the greet() function"

    def welcome():
        return "now you are in the welcome() function"

    if name == "yasoob":
        return greet  # 如果后面加上（），函数就会执行。如果你不放括号在它后面，那它可以被到处传递，并且可以赋值给别的变量而不去执行它。
    else:
        return welcome


# `a`现在指向到hi()函数中的greet()函数
a = hi()
# print(a)
# outputs: <function greet at 0x7f2143c01500>
# print(a())
# outputs: now you are in the greet() function
# print(hi("Tom哥")())  # 也可以这种写法，第一个（）表示执行hi函数，但返回另一个函数；第二个（）则执行另一个函数


# 3、将函数作为参数传给另一个函数

def hi():
    return "hi yasoob!"


def doSomethingBeforeHi(func):
    print("I am doing some boring work before executing hi()")
    print(func())


doSomethingBeforeHi(hi)
